package ke07.pm.reihe3;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class HundredItemBagDreiTest<T>
{
   	 HundredItemBagDrei <T> itemTest;
	 
  @Before
    public void setUp() throws Exception
    {
     	itemTest= new HundredItemBagDrei<T>();
   }

    @After
    public void tearDown() throws Exception  {
      	itemTest=null;
    }

    @Test
    public void testSize()
    {
        assertEquals(0, itemTest.size());

    }

    @Test
    public void testAdd()
    {
        assertFalse(itemTest.add((T) "test"));
        assertTrue(itemTest.add((T) "test"));
        assertFalse(itemTest.add((T) "Hallo"));
    }

    @Test
    public void testRemove()
    {
        // 3 Elemente hinzufügen, nach jedem prüfen ob sich Größe um 1 erhöht
        itemTest.add((T) "1");
        assertEquals(1, itemTest.size());
        itemTest.add((T) "1");
        assertEquals(2, itemTest.size());
        itemTest.add((T) "2");
        assertEquals(3, itemTest.size());

        // prüfen, ob "1" tatsächlich zweimal vorhanden ist
        assertEquals(2, itemTest.count((T) "1"));

        // prüfen, ob richtige booleans zurückgegeben werden
        assertFalse(itemTest.remove((T) "1"));
        assertTrue(itemTest.remove((T) "1"));
        assertTrue(itemTest.remove((T) "1"));

        // prüfen, ob "1" tatsächlich nicht mehr vorhanden ist
        assertFalse(itemTest.contains((T) "1"));

        // Prüfen, ob "2" immernoch vorhanden ist
        assertTrue(itemTest.contains((T) "2"));

        // "2" löschen und prüfen ob es nicht mehr enthalten ist
        itemTest.remove((T) "2");
        assertFalse(itemTest.contains((T) "2"));
    }    
    
    public void testCount1()
    {
        itemTest.add((T) "Hallo");
        itemTest.add((T) "Hallo");
        assertEquals(itemTest.count((T) "Hallo"), 2);
        
    }
    
    @Test
    public void testCount2()
    {
        itemTest=null;
        assertNull(itemTest);
        
    }

    @Test
    public void testContains1()
    {
        itemTest.add((T) "Hallo");
        assertTrue(itemTest.contains((T) "Hallo"));
    }
    
    @Test
    public void testContains2()
    {
        itemTest.add((T) "Hallo");
        assertFalse(itemTest.contains((T) "Hey"));
    }

    @Test
    public void testToArray1()
    {
       T [] array = itemTest.toArray();
       assertEquals(array, itemTest);
    }
    
    @Test
    public void testToArray2()
    {
       itemTest=null;
       assertEquals(itemTest.toArray(), itemTest);
    }

}
